# Python3 函数
# 函数是组织好的，可重复使用的，用来实现单一，或相关联功能的代码段。
# 函数能提高应用的模块性，和代码的重复利用率。你已经知道Python提供了许多内建函数，比如print()。但你也可以自己创建函数，这被叫做用户自定义函数。
# 1.定义一个函数
# 你可以定义一个由自己想要功能的函数，以下是简单的规则：
# 函数代码块以 def 关键词开头，后接函数标识符名称和圆括号 ()。
# 任何传入参数和自变量必须放在圆括号中间，圆括号之间可以用于定义参数。
# 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
# 函数内容以冒号 : 起始，并且缩进。
# return [表达式] 结束函数，选择性地返回一个值给调用方，不带表达式的 return 相当于返回 None。
# 语法
# Python 定义函数使用 def 关键字，一般格式如下：
# def 函数名（参数列表）:
#     函数体

def hi():
    print('hi')


def hello(str1):
    print('hello', str1)


def _sum(a, b, c=35):
    return a + b + c


def _print(a, b, *c):
    print(a)
    print(b)
    print(type(c))
    for x in c:
        print(x)


hi()
hello('java')
print(_sum(3, 4))
_print(3, 4, 5, 6, 7, 8)
# 2.参数
# 以下是调用函数时可使用的正式参数类型：必需参数 关键字参数 默认参数 不定长参数
# 必需参数
# 必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样,不然会出现语法错误：
# 关键字参数
# 关键字参数和函数调用关系紧密，函数调用使用关键字参数来确定传入的参数值。使用关键字参数允许函数调用时参数的顺序与声明时不一致，因为 Python 解释器能够用参数名匹配参数值。
# 默认参数
# 调用函数时，如果没有传递参数，则会使用默认参数。
# 不定长参数
# 你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数，和上述 2 种参数不同，声明时不会命名

# 3.匿名函数
# Python 使用 lambda 来创建匿名函数。
# 所谓匿名，意即不再使用 def 语句这样标准的形式定义一个函数。
# lambda 只是一个表达式，函数体比 def 简单很多。
# lambda 的主体是一个表达式，而不是一个代码块。仅仅能在 lambda 表达式中封装有限的逻辑进去。
# lambda 函数拥有自己的命名空间，且不能访问自己参数列表之外或全局命名空间里的参数。
# 虽然 lambda 函数看起来只能写一行，却不等同于 C 或 C++ 的内联函数，后者的目的是调用小函数时不占用栈内存从而增加运行效率。
x = lambda a: a + 10
print(x(10))

# 4.return 语句
# return [表达式] 语句用于退出函数，选择性地向调用方返回一个表达式。不带参数值的 return 语句返回 None。
